package gbench.sandbox.data.index;

import java.util.UUID;
import java.util.function.Function;

import gbench.common.matlib.algebra.lisp.IRecord;

public interface ITableSearchEngine {

    /**
     * 
     * @param uuid     键名 若是 null 则随机生成一个UUID
     * @param dataItem 数据项目
     */
    public UUID globalPut(final UUID uuid, final IRecord dataItem);

    /**
     * 
     * @param uuid
     * @param dataItem
     */
    public default UUID globalPut(final IRecord dataItem) {
        return this.globalPut(null, dataItem);
    }

    /**
     * 
     * @param uuid
     * @return
     */
    public IRecord globalGet(final UUID uuid);
    
    /**
     * 
     * @return
     */
    public IRecord getConfig();
    
    /**
     * 
     * @param config
     * @return
     */
    public IRecord setConfig(IRecord config);
    
    /**
     * 使用 id 索引进行数据检索. <br>
     * 实际使用的 索引文件为 tablen的id文件 即 indexStore
     * 
     * key 用来 标记 关键字位置 key 的值 就是 keyword <br>
     * table 用来标记 索引位置 table 的数据 就是 index 数据索引，id索引，name索引<br>
     * 每个索引都是 一个 UUID,用来 指向 一个 完整的 数据记录IRecord <br>
     * 
     * @param keyTblBindings 键名表 绑定序列:key1,table1,key2,table2,....
     * @return encoder 函数
     *         keywords(key1:keyword1,key2,keyword2)->rec(key1:索引keyword1的结果,key1:索引keyword2的结果)
     */
    public Function<IRecord, IRecord> getEncoder(final String... keyTblBindings);

    /**
     * 使用 id 索引进行数据检索. <br>
     * 实际使用的 索引文件为 tablen的id文件 即 indexStore <br>
     * 
     * key 用来 标记 关键字位置 key 的值 就是 keyword <br>
     * table 用来标记 索引位置 table 的数据 就是 index 数据索引，id索引，name索引<br>
     * 每个索引都是 一个 UUID,用来 指向 一个 完整的 数据记录IRecord <br>
     * 
     * @param keyTblBindings 键表绑定序列
     * @param hit_mapper     值变换函数,命中数据即hit的变换函数
     * @return encoder 函数
     *         keywords(key1:keyword1,key2,keyword2)->rec(key1:索引keyword1的结果,key1:索引keyword2的结果)
     */
    public Function<IRecord, IRecord> getEncoder(final Function<IRecord, Object> hit_mapper,
            final String... keyTblBindings);

    /**
     * 使用 name 索引进行数据检索. <br>
     * 实际使用的 索引文件为 tablen的name索引文件 即 indexStore
     * 
     * key 用来 标记 关键字位置 key 的值 就是 keyword <br>
     * table 用来标记 索引位置 table 的数据 就是 index 数据索引，id索引，name索引<br>
     * 每个索引都是 一个 UUID,用来 指向 一个 完整的 数据记录IRecord <br>
     * 
     * @param keyTblBindings 键表绑定序列
     * @return decoder 函数
     *         keywords(key1:keyword1,key2,keyword2)->rec(key1:索引keyword1的结果,key1:索引keyword2的结果)
     */
    public Function<IRecord, IRecord> getDecoder(final String... keyTblBindings);

    /**
     * 使用 name 索引进行数据检索. <br>
     * 实际使用的 索引文件为 tablen的name索引文件 即 indexStore <br>
     * 
     * key 用来 标记 关键字位置 key 的值 就是 keyword <br>
     * table 用来标记 索引位置 table 的数据 就是 index 数据索引，id索引，name索引<br>
     * 每个索引都是 一个 UUID,用来 指向 一个 完整的 数据记录IRecord <br>
     * 
     * @param mapper         数据映射
     * @param keyTblBindings 键表绑定序列
     * @param hit_mapper     值变换函数,命中数据即hit的变换函数
     * @return decoder 函数
     *         keywords(key1:keyword1,key2,keyword2)->rec(key1:索引keyword1的结果,key1:索引keyword2的结果)
     */
    public Function<IRecord, IRecord> getDecoder(final Function<IRecord, Object> mapper,
            final String... keyTblBindings);

   

}
